import type { IQueue } from "../../types";

type node<T> = {
  value: T;
  next?: node<T>;
};

/**
 * @description 链表实现的队列;FIFO；时间复杂度O(1)
 * @author hzq
 * @date 2025-04-10 13:37:10
 */
class Queue<T> implements IQueue<T> {
  // 队列的长度
  private count: number;
  // 队列的头部节点
  private head?: node<T>;
  // 队列的尾部节点
  private tail?: node<T>;

  constructor() {
    // 初始化队列长度为0
    this.count = 0;
    // 初始化头部节点和尾部节点为空
    this.head = void 0;
    this.tail = void 0;
  }

  enqueue(...args: T[]) {
    args.forEach((item) => {
      // 创建一个新的节点
      const node = { value: item };
      // 队列长度加1
      this.count++;
      // 如果队列为空，则将新节点设置为头部和尾部节点
      if (!this.tail) {
        this.head = this.tail = node;
        return;
      }
      // 否则，将新节点添加到尾部节点后面
      this.tail.next = node;
      this.tail = node;
    });
  }

  dequeue() {
    // 如果队列为空，则返回空
    if (!this.head) return void 0;
    // 队列长度减1
    this.count--;
    // 将头部节点保存下来
    const head = this.head;
    // 将头部节点指向下一个节点
    this.head = this.head.next;
    // 将头部节点的next属性置为空
    head.next = void 0;
    // 如果队列为空，则将尾部节点置为空
    if (this.count === 0) {
      this.tail = void 0;
    }
    // 返回头部节点的值
    return head.value;
  }

  front() {
    // 返回头部节点的值
    return this.head?.value;
  }

  size() {
    return this.count;
  }

  isEmpty() {
    return this.count === 0;
  }

  clear() {
    this.count = 0;
    this.head = void 0;
    this.tail = void 0;
  }

  toString() {
    return this.isEmpty() ? null : `Queue [${this.front()},...rest]`;
  }
}

// 导出Queue类
export default Queue;
